package com.example.controller;

import com.example.anno.LogAspect;
import com.example.aspect.MyLog;
import com.example.mapper.EmpMapper;
import com.example.models.*;
import com.example.utils.JWTUtils;
import lombok.extern.slf4j.Slf4j;
import org.codehaus.jettison.json.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.*;

// Slf4j注解添加后可以使用log.info添加日志
@Slf4j
@CrossOrigin(origins = "*")
@RestController
@Transactional// 开启事务管理，当接口中某一行数据报错，那么之前做的操作都会回滚，
public class studentController {

    @Autowired
    private EmpMapper xmlUser;
    @Autowired
    private JWTUtils JWTUtils;
    // 获取学生列表
    @GetMapping("/students")
    public ResultList list(student s) {
        System.out.println(s.toString());
        log.info("查询所有学生信息的日志记录");
        return ResultList.success(xmlUser.StudentList(s));
    }

    @LogAspect// 自己创建的注解用于aop控制监听
    // 获取单个用户信息
    @PostMapping("/getUser")
    public ResultList getUser(Integer id) {
        log.info("查询id:" + id + "的数据");
        if (id != null) {
            List<student> list = xmlUser.getUser(id, null);
            if (!list.isEmpty()) {
                return ResultList.success(list);
            } else {
                return ResultList.error("查无此人");
            }

        } else {
            return ResultList.error("参数不合法");
        }

    }


    // 注册
    @PostMapping("/interceptor/regist")
    public ResultList regist(student stu){
        System.out.println(stu.toString());
        log.info("登录查询手机号" + stu.getPhone());
        if (stu.getPhone() != null && stu.getPassword() != null) {
            xmlUser.creatStudent(stu);
            return ResultList.success("注册成功");
        } else {
            return ResultList.error("手机号不能为空");
        }
    }


    @MyLog// 这个注解是aop标识注解，此注解作用于当前的类
    // 登录
    @PostMapping("/login")
    public ResultList login(String phone, String password) {
        log.info("登录查询手机号" + phone);
        if (phone != null) {
            List<student> list = xmlUser.getUser(null, phone);
            if (!list.isEmpty()) {
                if (Objects.equals(list.get(0).getPassword(), password)) {
                    Map<String, Object> claims = new HashMap<>();
                    claims.put("phone",list.get(0).getPhone());
                    claims.put("id",list.get(0).getId());
                    claims.put("password",list.get(0).getPassword());
                    String jwt = JWTUtils.GetJWT(claims);
                    return ResultList.success(jwt);
                } else {
                    return ResultList.error("密码错误 ");
                }
            } else {
                return ResultList.error("用户不存在");
            }

        } else {
            return ResultList.error("手机号不能为空");
        }

    }

    @LogAspect// 自己创建的注解用于aop控制监听
    // 新建学生
    @PutMapping("/create/student")
    public ResultList createStudent(student stu) {
        // 检查各个字段是否为空或空字符串
        if (stu.getName() == null && stu.getName().trim().isEmpty()) {
            return ResultList.error("name不能为空");
        }
        if (stu.getPhone() == null && stu.getPhone().trim().length() == 11) {
            return ResultList.error("phone不能为空");
        }
        if (stu.getPassword() == null && stu.getPassword().trim().isEmpty()) {
            return ResultList.error("password不能为空");
        }
        if (stu.getAge() == null && Integer.toString(stu.getAge()).trim().isEmpty()) {
            return ResultList.error("age不能为空");
        }
        if (stu.getGender() == null && stu.getGender().trim().isEmpty()) {
            return ResultList.error("gender不能为空");
        }
        if (stu.getGrade() == null && stu.getGrade().trim().isEmpty()) {
            return ResultList.error("grade不能为空");
        }
        if (stu.getUserId() == null && stu.getUserId().trim().isEmpty()) {
            return ResultList.error("userId不能为空");
        }
        xmlUser.creatStudent(stu);
        return ResultList.success("创建成功");
    }


    @LogAspect// 自己创建的注解用于aop控制监听
    // 删除单个学生
    @DeleteMapping("/delete/students")
    public ResultList deleteStudents(String str) throws JSONException {
        log.info("正在删除学生",str);
        try {
            List<String> list = List.of(str.split(","));
            if (!list.isEmpty()) {
                xmlUser.DeleteStudents(list);
                return ResultList.success("删除学生成功");
            } else {
                return ResultList.error("数据不能为空");
            }
        } catch (NullPointerException e) {
            return ResultList.error("传递的数据为空");
        } catch (Exception e) {
            return ResultList.error("删除学生失败，原因：" + e.getMessage());
        }
    }


    @LogAspect// 自己创建的注解用于aop控制监听
    //修改学生
    @PostMapping("/update/student")
    public ResultList updateStudent(student stu) {
        if (stu.getAge() != null) {
            if (stu.getAge().toString().isEmpty()) {
                stu.setAge(null);
            }
        }
        if (stu.getId() != null) {
            if (!stu.getId().toString().isEmpty()) {
                xmlUser.updateStudent(stu);
                return ResultList.success("修改成功");
            } else {
                return ResultList.error("未指定修改学生学号");
            }
        } else {
            return ResultList.error("未指定修改学生学号");
        }
    }


    // 忘记密码
    @PostMapping("/interceptor/forget")
    public ResultList ForgetPassword(student stu){
        Integer num =  xmlUser.ForgetPassword(stu);
        if(num>0){
            return ResultList.success("更新成功");
        }else {
            return ResultList.error("账号不存在");
        }


    }
}
